<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 大数据数组区间求和
        // 现在有一个10000个数值的数组
        // 数组不可变
        const nums = [-1, 0, 1, 5, 10, -9, -7, 30, -44];
        // 通过sumPager函数,传入两个参数(开始下标和结束下标),需要可以累加获取到对应区间内的所有数值的总和
        // (包括开始和结束的两个数值)
        // 例如:sumPager(0,2) => 0  =>等于-1+0+1
        // 例如:sumPager(2,5) => 7  =>等于1+5+10+(-9)
        // 例如:sumPager(4,7) => 0  =>等于10+(-9)+(-7)+30

        // 该题在实现功能的前提下,要考虑下计算性能
        // 注意:sumPager会被调用多次

        // 该方法的循环次数,每统计一次,计算次数10000
        // function sumPager(startIndex,endIndex){
        //     // reduce的第二参数是用于指定初始值,可以不传
        //     // 如果不传该参数,pre等于数组中的第一项
        //     return nums.reduce((pre,item,index)=>{
        //         if(index>=startIndex&&index<=endIndex){
        //             return pre + item
        //         }else{
        //             return pre;
        //         }
        //     },0)
        // }

        // 先对数组进行区间切割再统计,该方法的循环次数,每统计一次,计算次数小于等于10000
        // function sumPager(startIndex, endIndex) {
        //     // reduce的第二参数是用于指定初始值,可以不传
        //     // 如果不传该参数,pre等于数组中的第一项
        //     return nums.slice(startIndex,endIndex+1).reduce((pre, item, index) => {
        //         if (index >= startIndex && index <= endIndex) {
        //             return pre + item
        //         } else {
        //             return pre;
        //         }
        //     }, 0)
        // }

        // 思路:提前统计出,从0当当前下标的结果,存入新的数组,
        //      例如:如果需要1000-9999的数据,arr[9999]-arr[1000]
        // const totals = [-1, -1, 0, 5, 15, 6, -1, 29, -15];
        // sumPager(2,5)=>totals[5]-totals[2]=>6-(-1)=>7
        // 如果通过这个方法计算数值,第一次稳输,但是假设计算一万次,基础的10000+后续执行的10000
        (function(){
            const nums = [-1, 0, 1, 5, 10, -9, -7, 30, -44];
            const totals = [];

            nums.forEach((num,index)=>{
                if(index===0){
                    totals.push(num);
                }else{
                    totals.push(totals[index-1] + num);
                }
            })
            // console.log(totals)
            function sumPager(startIndex,endIndex){
                return  totals[endIndex]-totals[startIndex-1]
            }
            window.sumPager=sumPager;
        })();

        console.log(sumPager(2,5))
        // console.log(sumPager(0, 9999))
    </script>
</body>

</html>